package org.papervision3d.materials
{
    import flash.display.BitmapData;
    
    import flash.utils.getDefinitionByName;
    import flash.utils.Dictionary;
    import flash.utils.describeType;
    
    // The BitmapAssetMaterial class creates a texture from a Bitmap library symbol.
    // Materials collects data about how objects appear when rendered.
    public class BitmapAssetMaterial extends BitmapMaterial
    {
        // The BitmapAssetMaterial class creates a texture from a Bitmap library asset.
        // @param    id                  The linkage name of the Bitmap symbol in the library.
        // @param    initObject          [optional] - An object that contains additional properties with which to populate the newly created material.
        public function BitmapAssetMaterial(id:String, initObject:Object = null)
        {
            super(id, initObject);
        }
    
        protected override function createBitmap(asset:*):BitmapData
        {
            // Remove previous bitmap
            if (this._texture != asset)
            {
                _count[this._texture]--;
    
                var prevBitmap:BitmapData = _library[this._texture];
    
                if (prevBitmap && _count[this._texture] == 0)
                    prevBitmap.dispose();
            }
    
            // Retrieve from library or...
            var bitmap:BitmapData = _library[asset];
    
            // ...loadBitmap
            if (!bitmap)
            {
                var BitmapAsset:Class = getDefinitionByName(asset) as Class;
    
                var description:XML = describeType(BitmapAsset);
    
                // Check if Flash 9 Alpha
                if (description..constructor.length() == 0)
                    bitmap = new BitmapAsset();
                else
                    bitmap = new BitmapAsset( 0, 0 );

                _library[asset] = bitmap;
                _count[asset] = 0;
            }
            else
            {
                _count[asset]++;
            }
    
            return bitmap;
        }
    
        static private var _library:Dictionary = new Dictionary();
        static private var _count:Dictionary = new Dictionary();
    }
}
